// 2025.04.05 23:31:31 星期六 晴 自己 做 了 辣椒炒肉 番茄鸡蛋 晚上做的 锅包肉 老幸福了~ :)
// 这个是 感觉 一个个函数 写下去 好像 还没 这个 效率高 和 数据清晰

import { emptydata } from '../../../../../../../../../../global/Classes/cla_emptydata/Classes/cla_emptydata';
// eslint-disable-next-line no-unused-vars
import { dragList_operate } from '../../../../../../../../../../global/direct/dragList/Classes/cla_dragList_operate/Classes/cla_dragList_operate';
import { domTree } from '../../../../../../../../../../global/element/domTree';
import { create_ListenEvent_mana } from '../../../../../../../../../../global/element/Event/listenEvent_mana';
// eslint-disable-next-line no-unused-vars
import { unit_listenEvent_mana } from '../../../../../../../../../../global/element/Event/listenEvent_mana/Classes/cla_unit_listenEvent_mana';
import {
  appearElFunc,
  disappearElFunc,
  packNode,
} from '../../../../../../../../../../global/element/Func';
import {
  ObjectOnlyPushSet,
  removeObjectOnlyPushSet,
  toStringTypeCheck,
} from '../../../../../../../../../../global/Func/uniFunc/Func';
import { css_wind_light_hover } from '../../../../../../../../../DataDefine/sourceData';
import { create_static_focusDisplay_mana } from '../../../../../../../../../globalComps/comps/focusDisplay';
// eslint-disable-next-line no-unused-vars
import { focusDisplay_operate } from '../../../../../../../../../globalComps/comps/focusDisplay/Classes/cla_focusDisplay_operate/cla_focusDisplay_operate';
import { id_split } from '../../../../../../../../DataDefine/sourceData';
import {
  get_static_comps_arr_active,
  get_totalUniComps_keys,
  uni_form_attriKey,
} from '../../../../../../DataDefine/sourceData';
import {
  aunf_fD_uni_comp_cla,
  css_uni_comp_active_static_cla,
} from '../../../../DataDefine/sourceData';
import { get_cur_active_comps } from '../../../../Func/get_cur_active_comps';
import { win_static_namespace__fd_comps_add } from '../../DataDefine/sourceData';
import { focisDisplay_comps_add_eventBind } from './cla_focusDisplay_comps_add_eventBind';
import { focusDisplay_comps_add_staticNode } from './cla_focusDisplay_comps_add_staticNode';

const focusDisplay_comps_add_dataManaTag = 'focusDisplay_comps_add_dataMana';

/**
 * 全局 焦点元素 管理
 */
let win_static_focusDisplay = create_static_focusDisplay_mana(
  win_static_namespace__fd_comps_add
);

class focusDisplay_comps_add_dataMana {
  get [Symbol.toStringTag]() {
    return focusDisplay_comps_add_dataManaTag;
  }

  constructor() {}

  staticNode = new focusDisplay_comps_add_staticNode();

  /**
   * 全部 的 组件
   * @type {Array}
   */
  comps_arr_total = get_totalUniComps_keys();

  /**
   * 用于 存放 未 使用的 组件
   * @type {Array}
   */
  comps_arr_less = [];

  /**
   * 使用 中的 组件
   * @type {Array}
   */
  comps_arr_active = [];

  /**
   * 使用中 的 组件 副本
   * @type {Array}
   */
  comps_arr_truth;

  /**
   * 必须 组件
   * @type {string[]}
   */
  comps_arr_static_ues = get_static_comps_arr_active();

  /**
   * dialog 操作
   * @type {focusDisplay_operate}
   */
  cur_dialog_operate = win_static_focusDisplay.getOrCreate_focusDisplay_dom();

  /**
   * 特定 注入 this 绑定事件
   * @type {focisDisplay_comps_add_eventBind}
   */
  eventBind = new focisDisplay_comps_add_eventBind();

  /**
   * 事件 监听管理
   * @type {unit_listenEvent_mana}
   */
  eventM = new create_ListenEvent_mana(win_static_namespace__fd_comps_add);

  /**
   * 新创建 的 元素 集
   */
  #create_chi_node = new emptydata();

  /**
   * @type {dragList_operate}
   */
  active_container_use_dragList_obj;

  /**
   * 根据 给定的 keyVal 值 找到 创建的 子元素
   */
  #get_chi_node(keyVal) {
    if (this.#create_chi_node.data.includes(keyVal)) {
      return this.#create_chi_node[keyVal];
    }
  }

  /**
   * 计算 当前 未使用 的组件
   */
  #calculate_cur_lease_comps() {
    this.comps_arr_less = this.comps_arr_total.filter((item) => {
      return !this.comps_arr_active.includes(item);
    });
  }

  /**
   * 根据 keyVal 生成 dom 挂载 到 this 上
   * @param {string} keyVal
   */
  #create_uni_dom_keyVal_PackTo_create_chi_node(keyVal) {
    let domt = {
      queue: ['a'],
      tag: 'div',
      class: [css_wind_light_hover, aunf_fD_uni_comp_cla],
      attriKey: ['id', uni_form_attriKey],
      id: aunf_fD_uni_comp_cla + id_split + keyVal,
      [uni_form_attriKey]: keyVal,
      a: {
        tag: 'span',
        prop: ['innerHTML'],
        innerHTML: keyVal,
      },
    };

    if (this.comps_arr_static_ues.includes(keyVal)) {
      domt.class.push(css_uni_comp_active_static_cla);
    }

    ObjectOnlyPushSet(this.#create_chi_node, keyVal, domTree(domt));
  }

  /**
   * 批量创建 dom
   * @param {string[] | string} keyValArr
   */
  #create_uni_domArr_keyValArr(keyValArr) {
    if (toStringTypeCheck(keyValArr, 'string')) {
      keyValArr = [keyValArr];
    }

    for (const keyVal of keyValArr) {
      if (this[keyVal] != undefined) {
        continue;
      }
      this.#create_uni_dom_keyVal_PackTo_create_chi_node(keyVal);
    }
  }

  /**
   * 初始化 less 的 内容 填充
   */
  #init_container_dom_less() {
    this.staticNode.comps_container_less.innerHTML = '';

    this.#init_container_dom(
      this.staticNode.comps_container_less,
      this.comps_arr_less
    );
  }

  /**
   * 初始化 active 的 内容 填充
   */
  #init_container_dom_active() {
    this.staticNode.comps_container_active.innerHTML = '';

    this.#init_container_dom(
      this.staticNode.comps_container_active,
      this.comps_arr_active
    );
  }

  /**
   * 填充 容器 元素 内容
   * @param {HTMLElement} elt 容器 元素
   * @param {string[] | string} keyValArr 关键字 数组
   */
  #init_container_dom(elt, keyValArr) {
    this.#create_uni_domArr_keyValArr(keyValArr);
    for (const keyVal of keyValArr) {
      packNode(elt, this.#get_chi_node(keyVal));
    }
  }

  /**
   * 判定 当前 dom 是否 为 必须 的 使用 组件
   * @param {HTMLElement} elt 当前 判定 的 dom
   * @returns {boolean}
   */
  #is_static_active_dom(elt) {
    if (
      this.comps_arr_static_ues.includes(elt.getAttribute(uni_form_attriKey))
    ) {
      return true;
    }
    return false;
  }

  /**
   * 将 当前 元素 放置到 不应用 的 组件容器中
   * @param {HTMLElement} elt 当前 判定 的 dom
   */
  cur_dom_to_less_container(elt) {
    if (this.#is_static_active_dom(elt)) {
      return;
    }

    this.#cur_dom_to_other_comps_arr(
      'less',
      elt.getAttribute(uni_form_attriKey)
    );

    this.#cur_dom_to_container_aniam(this.staticNode.comps_container_less, elt);
  }

  /**
   * 将 当前 元素 放置到 应用 的 组件容器中
   * @param {HTMLElement} elt
   */
  cur_dom_to_active_container(elt) {
    this.#cur_dom_to_other_comps_arr(
      'active',
      elt.getAttribute(uni_form_attriKey)
    );

    this.#cur_dom_to_container_aniam(
      this.staticNode.comps_container_active,
      elt
    );
  }

  /**
   * 组件元素 应用动画
   * @param {HTMLElement} container 容器元素
   * @param {HTMLElement} elt 当前 组件元素
   */
  #cur_dom_to_container_aniam(container, elt) {
    disappearElFunc(elt, undefined, () => {
      packNode(container, elt);
      appearElFunc(elt);
    });
  }

  /**
   * 将 当前 元素 数据 信息 转移到 另一个 组件数组中
   * @param {'less' | 'active'} to_comps_arr 目标
   * @param {string} cur_keyVal
   */
  #cur_dom_to_other_comps_arr(cur_comps_arr, cur_keyVal) {
    let { from_comps_arr, to_comps_arr } = get_other_comps_arr(cur_comps_arr);

    removeObjectOnlyPushSet(this[from_comps_arr], cur_keyVal);

    ObjectOnlyPushSet(this[to_comps_arr], cur_keyVal);
  }

  /**
   * 判定 当前元素 是否是 组件元素
   * @param {HTMLElement} elt 当前 元素
   * @returns {boolean}
   */
  is_keyVal_uni_dom(elt) {
    if (elt.getAttribute(uni_form_attriKey) != undefined) {
      return true;
    }
    return false;
  }

  /**
   * 显示 dialog
   */
  display_dialog() {
    // 获取 组件 使用信息
    this.comps_arr_active = get_cur_active_comps();
    this.comps_arr_truth = get_cur_active_comps();

    this.#calculate_cur_lease_comps();

    // 加载 对应 组件 信息
    this.#init_container_dom_less();
    this.#init_container_dom_active();

    this.eventM.addEventListen(
      this.cur_dialog_operate.targetEl,
      'click',
      this.eventBind.backdrop_click
    );

    this.cur_dialog_operate.display();
  }

  /**
   * 关闭 dialog
   * 在 关闭后 执行 cb
   */
  cancle_dialog(cb) {
    this.eventM.removeEventListen(
      this.cur_dialog_operate.targetEl,
      'click',
      this.eventBind.backdrop_click
    );
    this.cur_dialog_operate.cancle(cb);
  }

  /***    长按 事件 */

  // /**
  //  * 长时按压 计时器
  //  * 按压 0.5s
  //  */
  // long_press_timer;

  // /**
  //  * 按下 延迟 反应 时间
  //  */
  // press_reaction_delay = press_reaction_delay;

  // /**
  //  * 当前 元素 是否 正在 长时按压
  //  * @type {boolean}
  //  */
  // is_long_press_ing;

  // /**
  //  * 长时按压 触发 该函数
  //  * @type {function}
  //  */
  // long_press_cb;

  // /**
  //  * 重新 启动 长时按压 计时器
  //  * @param {number} [press_time = 500] 按压延迟 出发时间 默认 500ms -- 单位 ms
  //  * @param {function} cb
  //  */
  // restart_long_press_timer(press_time = this.press_reaction_delay, cb) {
  //   this.long_press_cb = cb;

  //   this.long_press_timer = setTimeout(() => {
  //     this.is_long_press_ing = true;
  //     this.long_press_cb();
  //   }, press_time);
  // }

  // /**
  //  * 移除 计时 事件
  //  */
  // remove_long_press_timer() {
  //   this.is_long_press_ing = false;

  //   clearTimeout(this.long_press_timer);
  // }

  /***    长按 事件 */
}

/**
 * 返还 另一个 组件 数组 名称
 * @param {'less' | 'active'} cur_comps_arr
 * @returns {'comps_arr_active' | 'comps_arr_less'}
 */
function get_other_comps_arr(cur_comps_arr) {
  return cur_comps_arr == 'less'
    ? { from_comps_arr: 'comps_arr_active', to_comps_arr: 'comps_arr_less' }
    : { from_comps_arr: 'comps_arr_less', to_comps_arr: 'comps_arr_active' };
}

export { focusDisplay_comps_add_dataMana };
